home *** CD-ROM | disk | FTP | other *** search
- unit MainForm;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
- StdCtrls, ComCtrls,
- //My Units
- BasicThread,HiddenWordThread,IntegerList;
-
- type
- TForm1 = class(TForm)
- buPlay: TButton;
- edtHiddenWord: TEdit;
- LabelHiddenWord: TLabel;
- edtNoOfOpponents: TEdit;
- LabelNoOfOpponents: TLabel;
- UpDownNoOfOpponents: TUpDown;
- buStop: TButton;
- StatusBar: TStatusBar;
- procedure FormCreate(Sender: TObject);
- procedure buPlayClick(Sender: TObject);
- procedure buStopClick(Sender: TObject);
- procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
- private
- fHiddenWordThread:THiddenWordThread;
- fThreadsWithAnswer:integer;
- fOpponentThreadIDs:TIntegerList;
- procedure ThreadGotAnswer(var Message:TMessage);message WM_Signal_ThreadGotAnswer;
- procedure ThreadTerminating(var Message: TMessage);message WM_Signal_ThreadTerminating;
- procedure SetfThreadsWithAnswer(const Value: integer);
- property ThreadsWithAnswer:integer read fThreadsWithAnswer write SetfThreadsWithAnswer;
- end;
-
- var
- Form1: TForm1;
-
- implementation
-
- uses OpponentThread;
-
- {$R *.DFM}
-
- procedure TForm1.FormCreate(Sender: TObject);
- begin
- edtHiddenWord.Text:='';
- edtNoOfOpponents.Text:='5';
- fOpponentThreadIDs:=TIntegerList.Create;
- Randomize;
- end;
-
- procedure TForm1.buPlayClick(Sender: TObject);
- const
- cSuspended=FALSE;
- var
- i1:integer;
- ThreadID:THandle;
- begin
- if Length(edtHiddenWord.Text)=0then
- raise exception.create('Please enter a word');
- if Length(edtHiddenWord.Text)>30then
- raise exception.create('Word length cannot be greater than 30 characters');
- if StrToInt(edtNoOfOpponents.Text)<1then
- raise exception.create('Must have at least one opponent thread');
- if StrToInt(edtNoOfOpponents.Text)>200then
- raise exception.create('Can''t have more than 200 opponent threads');
- buPlay.Enabled:=FALSE;
- buStop.Enabled:=TRUE;
- ThreadsWithAnswer:=0;
- fHiddenWordThread:=THiddenWordThread.Create(cSuspended,edtHiddenWord.Text);
- for i1:=1to StrToInt(edtNoOfOpponents.Text)do
- begin
- TOpponentThread.Create(cSuspended,fHiddenWordThread.ThreadID,Handle,ThreadID);
- fOpponentThreadIDs.Add(ThreadID)
- end;
- end;
-
- procedure TForm1.buStopClick(Sender: TObject);
- var
- i1:integer;
- begin
- if not buStop.Enabled then exit;
- buStop.Enabled:=FALSE;
- Screen.Cursor:=crHourGlass;
- for i1:=0to fOpponentThreadIDs.count-1do
- PostThreadMessage(fOpponentThreadIDs[i1],WM_Quit,0,0);
- end;
-
- procedure TForm1.ThreadGotAnswer(var Message:TMessage) ;
- begin
- ThreadsWithAnswer:=ThreadsWithAnswer+1;
- end;
-
- procedure TForm1.SetfThreadsWithAnswer(const Value: integer);
- begin
- fThreadsWithAnswer:=Value;
- StatusBar.SimpleText:='Threads With Answer:'+IntToStr(fThreadsWithAnswer);
- end;
-
- procedure TForm1.ThreadTerminating(var Message:TMessage);
- var
- ThreadID:integer;
- begin
- ThreadID:=Message.wParam;
- fOpponentThreadIDs.Remove(ThreadID);
- if fOpponentThreadIDs.Count=0then
- begin
- PostThreadMessage(fHiddenWordThread.ThreadID,WM_Quit,0,0);
- buStop.Enabled:=FALSE;
- buPlay.Enabled:=TRUE;
- Screen.Cursor:=crDefault;
- end;
- end;
-
-
- procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
- begin
- CanClose:=fOpponentThreadIDs.Count=0;
- if not CanClose then
- ShowMessage('Threads Still Running');
- end;
-
- end.
-